/*
  数组的实例方法：
     flat() 
      作用：扁平化数组，把数组打平  -> 消除数组嵌套数组 -> 多维数组转一维数组
      返回：打平后的数组
      语法：array.flat(depth = 1)，
        参数：扁平的深度，默认值是1，只扁平一层，
        如果：不管数组嵌套数组有多少层，都打平，depth可传Infinity(无穷)
 */
// 嵌套一层
// const beauty = ['西施', ['貂蝉'], '杨玉环', ['王昭君', '杨幂']]
// const beauty = ['西施', '貂蝉', '杨玉环', '王昭君', '杨幂']
// const result = beauty.flat()
// console.log(result)
// console.log(beauty)

// 嵌套二层
// const beauty = ['西施', ['貂蝉'], '杨玉环', ['王昭君', ['杨幂']]]
// const result = beauty.flat(2)
// console.log(result)

// 嵌套多层
// const beauty = ['西施', [[[['貂蝉']]]], '杨玉环', ['王昭君', '杨幂']]
// const result = beauty.flat(Infinity)
// console.log(result)


// 实现flat方法的原理
Array.prototype._flat = function (depth = 1) {
  return flatten(this, depth >= 1 ? depth : 1)
  function flatten (arr, depth) {
    // 递归的结束表示，返回一个拷贝新的数组实例
    // if (depth <= 0) return [...arr]
    // return arr.reduce((accu, item) => {
    //   if (Array.isArray(item)) {// item是数组，递归处理
    //     accu.push(...flatten(item, depth - 1))
    //   } else {// item不是数组，直接添加到accu中即可
    //     accu.push(item)
    //   }
    //   return accu
    // }, [])

    // 等同于上方的代码，下面是优化版本（精简版本）
    return depth <= 0 ?
      [...arr] : arr.reduce((accu, item) => Array.isArray(item)
        ? [...accu, ...flatten(item, depth - 1)] : [...accu, item], [])
  }
}
const beauty = ['西施', [[[['貂蝉']]]], '杨玉环', ['王昭君', '杨幂']]
const result = beauty._flat(Infinity)
console.log(result)


